home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 April / CMCD0404.ISO / Software / Shareware / Programare / sharp / wwwSharp_setup.exe / {app} / Examples / RssPublisher / Source / RSSpub.vbs < prev    next >
Text File  |  2004-02-04  |  10KB  |  374 lines

  1. ' ============================================
  2. ' this file contains functions that you can use to fill a string with 
  3. ' ASPRSS-compliant XML. This string can be stored in the file RSS.xml 
  4. ' or sent directly to the client.
  5. '
  6. ' home:    http://ASPRSS.com/
  7. ' discuss:  http://www.asplists.com/asplists/asprss.asp
  8. ' validate: http://ASPRSS.com/RSSform.asp
  9. ' ============================================
  10. Dim sRSSXML            ' contains resulting XML
  11. Dim sItems                ' contains contents of <items> element
  12.  
  13. ' ============================================
  14. ' Returns indentation string from indent level
  15. ' ============================================
  16. Function GetIndentString(iIndent)
  17.     GetIndentString = String(2*iIndent, " ")
  18. End Function
  19.  
  20. ' ============================================
  21. ' adds header to sRSSXML
  22. '
  23. ' The following parameters are mandatory:
  24. '  sSiteTitle, sSiteDescr, sSiteURL
  25. '
  26. ' The following parameters are optional:
  27. '  sSiteDetails, sImageURL, sAuthorNames, sAuthorEmails
  28. '  sFurtherReading
  29. '
  30. ' Note: sAuthorNames, sAuthorEmails and sFurtherReading can contain 
  31. '  multiple entries, separated by |. 
  32. '
  33. ' Both sAuthorNames and sAuthorEmails *must* have the same 
  34. '  number of  elements, but elements can be empty if required.
  35. ' ============================================
  36. Function RSSheader ( sSiteTitle, sSiteDescr, sSiteURL, sSiteDetails, sImageURL, sFurtherReading, sAuthorNames, sAuthorEmails ) 
  37.  
  38.     If Len ( sSiteTitle ) = 0 Or Len ( sSiteDescr ) = 0 Or Len ( sSiteURL ) = 0 Then
  39.         'Response.Write ( "<p>Must pass sSiteTitle,sSiteDescr,sSiteURL into RSSheader<p>" )
  40.         RSSheader = False
  41.         Exit Function
  42.     End If
  43.  
  44.     ' add header to XML string
  45.     sRSSXML = "<?xml version=""1.0""?>" & chr(10)
  46.  
  47.     sRSSXML = sRSSXML & "<rdf:RDF" & chr(10)
  48.     
  49.     ' specify namespaces
  50.     sRSSXML = sRSSXML & "  xmlns:rdf=""http://www.w3.org/1999/02/22-rdf-syntax-ns#""" & chr(10)
  51.     sRSSXML = sRSSXML & "  xmlns:dc=""http://purl.org/dc/elements/1.1/""" & chr(10)
  52.     sRSSXML = sRSSXML & "  xmlns:fr=""http://ASPRSS.com/fr.html""" & chr(10)
  53.     sRSSXML = sRSSXML & "  xmlns:pa=""http://ASPRSS.com/pa.html""" & chr(10)
  54.     sRSSXML = sRSSXML & "  xmlns=""http://purl.org/rss/1.0/"">" & chr(10)
  55.  
  56.     ' specify channel
  57.     sRSSXML = sRSSXML & "<channel rdf:about=""" + sSiteURL + """>" & chr(10)
  58.  
  59.         If Not RSStag ( sRSSXML, "title", sSiteTitle, 1 ) Then
  60.             RSSheader = False
  61.             Exit Function
  62.         End If
  63.  
  64.         If Not RSStag ( sRSSXML, "link", sSiteURL, 1 ) Then
  65.             RSSheader = False
  66.             Exit Function
  67.         End If
  68.  
  69.         If Not RSStag ( sRSSXML, "description", sSiteDescr, 1 ) Then
  70.             RSSheader = False
  71.             Exit Function
  72.         End If
  73.  
  74.         If Len ( sSiteDetails ) > 0 Then
  75.             If Not RSStag ( sRSSXML, "dc:publisher", sSiteDetails, 1 ) Then
  76.                 RSSheader = False
  77.                 Exit Function
  78.             End If
  79.         End If
  80.  
  81.         If Len ( sFurtherReading ) > 0 Then
  82.             If  Not RSStag ( sRSSXML, "fr:url", sFurtherReading, 1 ) Then
  83.                 RSSheader = False
  84.                 Exit Function
  85.             End If
  86.         End If
  87.  
  88.         If Len ( sAuthorNames ) > 0 Then
  89.             If Not RSSauthor ( sRSSXML, sAuthorNames, sAuthorEmails, 1 ) Then
  90.                 RSSheader = False
  91.                 Exit Function
  92.             End If
  93.         End If
  94.  
  95.         If Len ( sImageURL ) > 0 Then
  96.             sRSSXML = sRSSXML & GetIndentString(1) & "<image rdf:resource=""" + sImageURL + """ />" & chr(10)
  97.         End If
  98.         
  99.         ' add empty <items>, filled in later by RSSfooter()
  100.         If Not RSStag ( sRSSXML, "items", "", 1 ) Then
  101.             RSSheader = False
  102.             Exit Function
  103.         End If
  104.  
  105.         ' initialize <items> store
  106.         sItems = ""
  107.  
  108.     ' close channel
  109.     sRSSXML = sRSSXML & "</channel>" & chr(10)
  110.  
  111.     ' add optional image
  112.     If Len ( sImageURL ) > 0 Then
  113.  
  114.         sRSSXML = sRSSXML & GetIndentString(1) & "<image rdf:about=""" + sImageURL + """>" & chr(10)
  115.  
  116.             If Not RSStag ( sRSSXML, "title", sSiteTitle, 2 ) Then
  117.                 RSSheader = False
  118.                 Exit Function
  119.             End If
  120.  
  121.             If Not RSStag ( sRSSXML, "url", sImageURL, 2 ) Then
  122.                 RSSheader = False
  123.                 Exit Function
  124.             End If
  125.  
  126.             If Not RSStag ( sRSSXML, "link", sSiteURL, 2 ) Then
  127.                 RSSheader = False
  128.                 Exit Function
  129.             End If
  130.  
  131.         sRSSXML = sRSSXML & GetIndentString(1) & "</image>" & chr(10)
  132.  
  133.     End If
  134.  
  135.     RSSheader = True
  136.  
  137. End Function
  138.  
  139. ' ============================================
  140. ' adds item to sRSSXML
  141. '
  142. ' The following parameters are mandatory:
  143. '  sTitle, sDescr, sURL
  144. '
  145. ' The following parameters are optional:
  146. '  sDate, sCategory, sKeywords, sAuthorNames, sAuthorEmails
  147. '
  148. ' Note: sAuthorNames and sAuthorEmails can contain multiple entries, 
  149. '  separated by |. Both *must* have the same number of  elements,
  150. '  but elements can be empty if required.
  151. ' sKeywords can contain multiple keywords, but all will be grouped
  152. '  in a single element. Keywords should be seperated by commas.
  153. ' ============================================
  154. Function RSSitem ( sTitle, sDescr, sURL, sDate, sCategory, sKeywords, sAuthorNames, sAuthorEmails ) 
  155.  
  156.     Dim dDate
  157.     Dim sMonth 
  158.     Dim sDay
  159.     Dim sValidDate
  160.     'VVV - create each item as string and later add it to sRSSXML, better memory usage
  161.     Dim sItem 
  162.  
  163.     If Len ( sTitle ) = 0 Or Len ( sDescr ) = 0 Or Len ( sURL ) = 0 Then
  164.         'Response.Write ( "<p>Must pass sTitle,sDescr,sURL into RSSitem<p>" )
  165.         RSSitem = False
  166.         Exit Function
  167.     End If
  168.  
  169.     ' start new <resource>
  170.     sItem = sItem & GetIndentString(1) & "<item rdf:about=""" & sURL & """>" & chr(10)
  171.  
  172.         If Not RSStag ( sItem, "title", sTitle, 2 ) Then
  173.             RSSitem = False
  174.             Exit Function
  175.         End If
  176.  
  177.         If Not RSStag ( sItem, "description", sDescr, 2 ) Then
  178.             RSSitem = False
  179.             Exit Function
  180.         End If
  181.  
  182.         If Not RSStag ( sItem, "link", sURL, 2 ) Then
  183.             RSSitem = False
  184.             Exit Function
  185.         End If
  186.  
  187.         If Len ( sDate ) > 0 Then
  188.             ' make it a valid date according to 
  189.             ' http://www.w3.org/TR/NOTE-datetime
  190.  
  191.             ' get a date object
  192.             dDate = DateValue ( sDate )
  193.  
  194.             ' make sure month is 2 digits
  195.             sMonth = Right ( "0" & Month ( dDate ), 2)
  196.  
  197.             ' make sure day is 2 digits
  198.             sDay = Right ( "0" & Day ( dDate ), 2)
  199.  
  200.             ' make valid date
  201.             sValidDate = Year ( dDate ) & "-" & sMonth & "-" & sDay
  202.  
  203.             If Not RSStag ( sItem, "dc:date", sValidDate, 2 ) Then
  204.                 RSSitem = False
  205.                 Exit Function
  206.             End If
  207.         End If
  208.  
  209.         If Len ( sCategory ) > 0 Then
  210.             If Not RSStag ( sItem, "pa:category", sCategory, 2 ) Then
  211.                 RSSitem = False
  212.                 Exit Function
  213.             End If
  214.         End If
  215.  
  216.         If Len ( sKeywords ) > 0 Then
  217.             If Not RSStag ( sItem, "pa:keywords", sKeywords, 2 ) Then
  218.                 RSSitem = False
  219.                 Exit Function
  220.             End If
  221.         End If
  222.  
  223.         If Len ( sAuthorNames ) > 0 Then
  224.             If Not RSSauthor ( sItem, sAuthorNames, sAuthorEmails, 2 ) Then
  225.                 RSSitem = False
  226.                 Exit Function
  227.             End If
  228.         End If
  229.  
  230.     ' add to <items> store
  231.     sItems = sItems & GetIndentString(3) & "<rdf:li rdf:resource=""" & sURL & """/>" & chr(10)
  232.  
  233.     sItem = sItem & GetIndentString(1) & "</item>" & chr(10)
  234.  
  235.     sRSSXML = sRSSXML & sItem
  236.     RSSitem = True
  237.  
  238. End Function
  239.  
  240. ' ============================================
  241. ' adds footer to sRSSXML
  242. ' ============================================
  243. Function RSSfooter ( ) 
  244.  
  245.     Dim nItemsPos
  246.  
  247.     sRSSXML = sRSSXML & "</rdf:RDF>" & chr(10)
  248.  
  249.     ' fill in <items> element
  250.     nItemsPos = InStr ( sRSSXML, "</items>" )
  251.  
  252.     If nItemsPos = 0 Then
  253.         'Response.Write ( "<p>Missing <items> element<p>" )
  254.         RSSfooter = False
  255.         Exit Function
  256.     End If
  257.  
  258.     sRSSXML = Left ( sRSSXML, nItemsPos-1 ) & chr(10) & GetIndentString(2) & "<rdf:Seq>" & chr(10) & _
  259.         sItems & GetIndentString(2) & "</rdf:Seq>" & chr(10) & GetIndentString(1) & Mid ( sRSSXML, nItemsPos )
  260.  
  261.     RSSfooter = True
  262.  
  263. End Function
  264.  
  265. ' ============================================
  266. ' stores sRSSXML to file
  267. '
  268. ' The following parameters are mandatory:
  269. '  sFilename
  270. '
  271. ' note: requires write permission to file sFilename
  272. ' ============================================
  273. Function RSSpersist ( sFilename ) 
  274.  
  275.     Dim oFSO
  276.     Dim fFile
  277.  
  278.     ' create an instance of the FileSystemObject
  279.     'Set oFSO = Server.CreateObject ( "Scripting.FileSystemObject" )
  280.     Set oFSO = CreateObject ( "Scripting.FileSystemObject" )
  281.  
  282.     ' create file
  283.     'Set fFile = oFSO.CreateTextFile ( Server.MapPath ( sFilename ) )
  284.     Set fFile = oFSO.CreateTextFile ( sFilename )
  285.  
  286.     fFile.WriteLine ( sRSSXML )
  287.  
  288.     fFile.Close 
  289.  
  290.     Set fFile = Nothing
  291.     Set oFSO = Nothing
  292.  
  293.     RSSpersist = True
  294.  
  295. End Function
  296.  
  297. ' ============================================
  298. ' INTERNAL USE ONLY - DO NOT CALL DIRECTLY
  299. '
  300. ' store tag + value
  301. '
  302. ' The following parameters are mandatory:
  303. '  sTag, sValue
  304. ' ============================================
  305. Function RSStag ( ByRef sXml, sTag, sValue, iIndent )
  306.  
  307.     Dim Reg
  308.     Dim sStripped
  309.  
  310.     ' regular expression to remove HTML
  311.     Set Reg = New Regexp
  312.     Reg.Pattern = "<[^>]*>"
  313.     Reg.Global = True
  314.  
  315.     sStripped = Reg.Replace ( sValue, "" )
  316.  
  317.     sXml = sXml & GetIndentString(iIndent) & "<" & sTag & ">" & sStripped & "</" & sTag & ">" & chr(10)
  318.  
  319.     RSStag = True
  320.  
  321. End Function
  322.  
  323. ' ============================================
  324. ' INTERNAL USE ONLY - DO NOT CALL DIRECTLY
  325. '
  326. ' store authors in <dc:creator>'s
  327. '
  328. ' The following parameters are mandatory:
  329. '  sAuthorNames, sAuthorEmails
  330. '
  331. ' note: sName and sEmail *must* have the same number of  elements
  332. ' ============================================
  333. Function RSSauthor ( ByRef sXml, sAuthorNames, sAuthorEmails, iIndent )
  334.  
  335.     Dim sNames
  336.     Dim sEmails
  337.     Dim sName 
  338.     Dim sEmail
  339.     Dim I
  340.     
  341.     sNames = Split ( sAuthorNames, "|" )
  342.     sEmails = Split ( sAuthorEmails, "|" )
  343.  
  344.     If UBound ( sNames ) <> UBound ( sEmails ) Then
  345.         'Response.Write ( "<p>Must pass equal number of elements to RSSauthor<p>" )
  346.         RSSauthor = False
  347.         Exit Function
  348.     End If
  349.  
  350.     For I = 0 To UBound ( sNames )
  351.         sXml = sXml & GetIndentString(iIndent) & "<dc:creator>"
  352.  
  353.             sName = sNames ( I )
  354.             sEmail = sEmails ( I )
  355.  
  356.             ' add spaces and braces if both specified
  357.             If Len ( sName ) > 0 Then
  358.                 If Len ( sEmail ) > 0 Then
  359.                     sXml = sXml & sName & " (mailto:" & sEmail & ")"
  360.                 Else
  361.                     sXml = sXml & sName
  362.                 End If
  363.             Else
  364.                 sXml = sXml & "mailto:" & sEmail
  365.             End If
  366.                 
  367.         sXml = sXml & "</dc:creator>" & chr(10)
  368.     Next
  369.  
  370.     RSSauthor = True
  371.  
  372. End Function
  373.